..:: Menu ::.. ..:: Procedury i funkcje ::.. ..::Info i Reklamy::..

Pierwszy napisany przez nas program składał się wyłącznie z jednej funkcji main(). W praktyce takie sytuacje w ogóle się nie zdarzają, a kod aplikacji zawiera najczęściej bardzo wiele procedur i funkcji. Poznamy zatem dogłębnie istotę tych konstrukcji, by móc pisać prawdziwe programy.
Procedura lub funkcja to fragment kodu, który jest wpisywany raz, ale może być wykonywany wielokrotnie. Realizuje on najczęściej jakąś pojedynczą czynność przy użyciu ustalonego przez programistę algorytmu. Jak wiemy, działanie wielu algorytmów składa się na pracę całego programu, możemy więc powiedzieć, że procedury i funkcje są podprogramami, których cząstkowa praca przyczynia się do funkcjonowania programu jako całości.
Gdy mamy już (a mamy? :D) pełną jasność, czym są podprogramy i rozumiemy ich rolę, wyjaśnijmy sobie różnicę między procedurą a funkcją.

Procedura to wydzielony fragment kodu programu, którego zadaniem jest wykonywanie jakiejś czynności.
Funkcja zawiera kod, którego celem jest obliczenie i zwrócenie jakiejś wartości.
Procedura może przeprowadzać działania takie jak odczytywanie czy zapisywanie pliku, wypisywanie tekstu czy rysowanie na ekranie. Funkcja natomiast może policzyć ilość wszystkich znaków ‘a’ w danym pliku czy też wyznaczyć najmniejszą liczbę spośród wielu podanych.
W praktyce (i w języku C++) różnica między procedurą a funkcją jest dosyć subtelna, dlatego często obie te konstrukcje nazywa się dla uproszczenia funkcjami. A ponieważ lubimy wszelką prostotę, też będziemy tak czynić :)

Własne funcje

Na początek dokonamy prostej modyfikacji programu napisanego wcześniej. Jego kod będzie teraz wyglądał tak:
// Functions – przykład własnych funkcji
#include <iostream>
#include <conio.h>
void PokazTekst()
{
std::cout << "Umiem juz pisac wlasne funkcje! :)" << std::endl;
}
void main()
{
PokazTekst();
getch();
}
Po kompilacji i uruchomieniu programu nie widać większych zmian – nadal pokazuje on komunikat w oknie konsoli (oczywiście o innej treści, ale to raczej średnio ważne :)). Jednak wyraźnie widać, że kod uległ poważnym zmianom. Na czym one polegają? Otóż wydzieliliśmy fragment odpowiedzialny za wypisywanie tekstu do osobnej funkcji o nazwie PokazTekst(). Jest ona teraz wywoływana przez naszą główną funkcję, main(). Zmianie uległ więc sposób działania programu – rozpoczyna się od funkcji main(), ale od razu „przeskakuje” do PokazTekst(). Po jej zakończeniu ponownie wykonywana jest funkcja main(), która z kolei wywołuje funkcję getch(). Czeka ona na wciśnięcie dowolnego klawisza i gdy to nastąpi, wraca do main(), której jedynym zadaniem jest teraz zakończenie programu.

Tryb śledzenia

Przekonajmy się, czy to faktycznie prawda! W tym celu uruchomimy nasz program w specjalnym trybie krokowym. Aby to uczynić wystarczy wybrać z menu opcję Debug|Step Into lub Debug|Step Over, ewentualnie wcisnąć F11 lub F10. Zamiast konsoli z wypisanym komunikatem widzimy nadal okno kodu z żółtą strzałką, wskazującą nawias otwierający funkcję main(). Jest to aktualny punkt wykonania (ang. execution point) programu, czyli bieżąco wykonywana instrukcja kodu – tutaj początek funkcji main().
Wciśnięcie F10 lub F11 spowoduje „wejście” w ową funkcję i sprawi, że strzałka spocznie teraz na linijce
PokazTekst();
Jest to wywołanie naszej własnej funkcji PokazTekst(). Chcemy dokładnie prześledzić jej przebieg, dlatego wciśniemy F11 (lub skorzystamy z menu Debug|Step Into), by skierować się do jej wnętrza. Użycie klawisza F10 (albo Debug|Step Over) spowodowałoby ominięcie owej funkcji i przejście od razu do następnej linijki w main(). Oczywiście mija się to z naszym zamysłem i dlatego skorzystamy z F11. Punkt wykonania osiadł obecnie na początku funkcji PokazTekst(), więc korzystając z któregoś z dwóch używanych ostatnio klawiszy możemy umieścić go w jej kodzie. Dokładniej, w pierwszej linijce
std::cout << "Umiem juz pisac wlasne funkcje! :)" << std::endl;
Jak wiemy, wypisuje ona tekst do okna konsoli. W tym momencie użyj Alt+Tab lub jakiegoś innego windowsowego sposobu, by przełączyć się do niego. Przekonasz się (czarno na czarnym ;)), iż jest całkowicie puste. Wróć więc do okna kodu, wciśnij F10/F11 i ponownie spójrz na konsolę. Zobaczysz naocznie, iż std::cout faktycznie wypisuje nam to, co chcemy :D
Po kolejnych dwóch uderzeniach w jeden z klawiszy powrócimy do funkcji main(), a strzałka zwana punktem wykonania ustawi się na
getch();
Moglibyśmy teraz użyć F11 i zobaczyć kod źródłowy funkcji getch(), ale to ma raczej niewielki sens. Poza tym, darowanemu koniowi (jakim są z pewnościa tego rodzaju funkcje!) nie patrzy się w zęby :) Posłużymy się przeto klawiszem F10 i pozwolimy funkcji wykonać się bez przeszkód.
Zaraz zaraz… Gdzie podziała się strzałka? Czyżby coś poszło nie tak?… Spokojnie, wszystko jest w jak najlepszym porządku. Pamiętamy, że funkcja getch() oczekuje na przyciśnięcie dowolnego klawisza, więc teraz wraz z nią czeka na to cała aplikacja. Aby nie przedłużać nadto wyczekiwania, przełącz się do okna konsoli i uczyń mu zadość :) I tak oto dotarliśmy do epilogu – punkt wykonania jest teraz na końcu funkcji main(). Tu kończy się kod napisany przez nas, na program składa się jednak także dodatkowy kod, dodany przez kompilator. Oszczędzimy go sobie i wciśnięciem F5 (tudzież Debug|Continue) pozwolimy przebiec po nim sprintem i w konsekwencji zakończyć program.
Tą oto drogą zapoznaliśmy się z bardzo ważnym narzędziem pracy programisty, czyli trybem krokowym, pracą krokową lub trybem śledzenia10. Widzieliśmy, że pozwala on dokładnie przestudiować działanie programu od początku do końca, poprzez wszystkie jego instrukcje. Z tego powodu jest nieocenionym pomocnikiem przy szukaniu i usuwaniu błędów w kodzie.

Przebieg programu

Konkluzją naszej przygody z funkcjami i pracą krokową będzie diagram, obrazujący działanie programu od początku do końca:

Czarne linie ze strzałkami oznaczają wywoływanie i powrót z funkcji, zaś duże białe – ich wykonywanie. Program zaczyna się u z lewej strony schematu, a kończy po prawej; zauważmy też, że w obu tych miejscach wykonywaną funkcją jest main(). Prawdą jest zatem fakt, iż to ona jest główną częścią aplikacji konsolowej.
Jeśli opis słowny nie był dla ciebie nie do końca zrozumiały, to ten schemat powinien wyjaśnić wszystkie wątpliwości :)
<--- Wstecz | Dalej --->

   
©Copyright by garUs